﻿
//
//  server.hpp
//  TcpServer
//
//  Created by sandrial on 2017/9/20.
//  Copyright © 2017年 wzy. All rights reserved.
//

#ifndef server_hpp
#define server_hpp

#include "mysql.hpp"
#include <vector>
#include <string>

#ifndef _WIN32
#include <netinet/in.h>
#else
#include <winsock.h>
#endif


#define DEFAULT_PORT 8003
#define MAXSIZE 4096

//用户数据
struct UserInf{
    int _id;//服务器和客户端的临时id
    int _sid;//客户端的socket id
    int status;//状态
    
    UserInf(int id,int sid, int _status)
    :_id(id),_sid(sid),status(_status){
        
    }
};

//线程消息传递数据结构
struct threadmes{
    int connect_fd;
    class Server* s;
};

//用户send数据流
struct userStream{
    int id;//用户表id
    std::string stream;//接收的数据流
};

class Server{
private:
    int _sid;//服务器监听socketid
    
    MysqlDb _db;//mysql数据库
    
    /*
     用户数据表
     用户数据表是临时表，为了避免使用数据库进行查询，使用内存创建用户数据表进行管理
     用户数据表的数据：
     _id 用户与服务器进行交流的内置id，由客户端和服务器同时记录，避免使用hash算法
     _sid 用户与服务器通信的socketid
     status 用户状态，主要控制用户传递数据流权限
     规定客户端发送消息格式：_id@数据流
     数字代表用户与服务器的内置id，@标志数据流开始。
     */
    std::vector<struct UserInf> users;
    
    void server_start();//服务器开启监听
    
    int login(std::string &usr, std::string& pswd);//用户登录
    
public:
    int run();
    void callback(int,void *);//处理消息回调函数

#ifndef _WIN32 
	static void *MessageIn(void *mes);//处理消息
#else
	static DWORD WINAPI Server::EstablishClient(void* tmes);
#endif
   
};

#endif /* server_hpp */
